#include <iostream>
#include <algorithm>
#include <unordered_set>
using namespace std;
typedef pair<int, int> PII;
const int N = 100010;
// 只需要维护哪些店面有单子即可
unordered_set<int> up;
int prior[N], last[N];
// bool st[N];
// 为了省去一个个减优先级的问题，需要记录上一次有订单的时间
// 然后一次减去一大段，不用考虑没有收到订单的餐厅
PII order[N];
// 主要注意：细节处理到位

// 要考虑的情况是有可能在减去的时候已经小于3了，导致已经出优先级
// 但是如果加减之后判断要不要出优先级，就会导致其加完之后还是在优先级内
int n, m, t;
int main()
{
    cin >> n >> m >> t;
    for(int i = 0; i < m; ++i)
    {
        int ti, di;
        cin >> ti >> di;
        order[i] = {ti, di};
    }
    int ans = 0;
    sort(order, order + m);
    for(int i = 0; i < m; )
    {
        PII& pp = order[i];
        int id = pp.second;
        int time = pp.first;
        int j =  i + 1;
        while(j < m && order[j] == order[i]) ++j;
        // 统计同一时间该公司的所有订单数量
        int cnt = j - i;
        int sub = pp.first - last[id] - 1;
        prior[id] = prior[id] - sub < 0 ? 0 : prior[id] - sub;
        // if(prior[id] <= 3) st[id] = false;
        if(prior[id] <= 3 && up.count(id)) up.erase(id);
        prior[id] += cnt * 2;
        last[id] = time;
        if(prior[id] > 5) up.insert(id);

        // if(prior[id] > 5) st[id] = true;
        i = j;
    }

    for(auto it = up.begin(); it != up.end();)
    {
        prior[*it] -= t - last[*it];
        if(prior[*it] <= 3) it = up.erase(it);
        else ++it;
    }
    cout << up.size() << endl;

    // for(int i = 1; i <= N; ++i)
    //     if(st[i])
    //     {
    //         ++ans;
    //         if(last[i]!= t)
    //         {
    //             prior[i] -= t - last[i];
    //             if(prior[i] <= 3) ans--;
    //         }
    //     }
    // cout << ans << endl;
    return 0;
}

